/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package com.sgsmcan.Controlador;

import com.sgsmcan.Dao.AlmacenDao;
import com.sgsmcan.Dao.AlmacenDaoImp;
import com.sgsmcan.Dao.ProductoDao;
import com.sgsmcan.Dao.ProductoDaoImp;
import com.sgsmcan.Entidad.Almacen;
import com.sgsmcan.Entidad.Producto;
import com.sgsmcan.Hibernate.HibernateUtil;

import com.sgsmcan.Utils.Paginacion;
import com.sgsmcan.Utils.Utilitario;
import java.io.Serializable;
import java.util.List;
import javax.faces.application.NavigationHandler;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.context.FacesContext;
import javax.faces.event.ActionEvent;
import org.hibernate.HibernateException;
import org.hibernate.Query;
import org.hibernate.Session;
import org.primefaces.model.LazyDataModel;

/**
 *
 * @author GOMEZ
 */
@ManagedBean(name = "almacenBean")
@ViewScoped
public class AlmacenControlador implements Serializable {

    Almacen almacen;
    AlmacenDao almacendao;
    private LazyDataModel<Almacen> almacenes;

    ProductoDao productodao;
    List<Producto> productos;
    Producto producto;
    
    
    public AlmacenControlador() {
        almacen = new Almacen();
        producto = new Producto();
        almacendao = new AlmacenDaoImp();
        productodao = new ProductoDaoImp();
        productos = productodao.productos();
    }

    public void initLista() {
        if (!FacesContext.getCurrentInstance().isPostback()) {
            almacenes = new Paginacion<Almacen>(almacendao.getAlmacen());
        }
    }

    public void initUpdate() {
        if (!FacesContext.getCurrentInstance().isPostback()) {
            Object parametro = Utilitario.getFlash("idalmacen");
            if (parametro == null) {
                FacesContext fc = FacesContext.getCurrentInstance();
                NavigationHandler nh = fc.getApplication().getNavigationHandler();
                nh.handleNavigation(fc, null, "/views/almacen/list.xhtml?faces-redirect=true");
            }
            Integer id = (Integer) parametro;
            productos = productodao.productos();
            almacen = almacendao.getAlmacenId(id);
            producto = almacen.getProducto();
        }
    }

    public void insertaralAlmacen(ActionEvent evt) {
        if (producto.getId() == 0) {
            Utilitario.enviarMensajeGlobalError("Por favor seleccione un producto");
            return;
        }

        
        if (almacen.getCantidad() == 0) {
            Utilitario.enviarMensajeGlobalError("Debe ingresar la cantidad del producto");
            return;
        }

        if(cuentaProductos(producto.getId())<=0){
        } else {
            Utilitario.enviarMensajeGlobalError("Este producto ya se ingreso al almacén.");
            return;
        }
        
        try {
            almacen.setProducto(producto);
            almacen.setEstado(true);
            almacendao.insertar(almacen);
            limpiar();
        } catch (Exception e) {
            Utilitario.enviarMensajeGlobalError("Error al insertar los datos");
            return;
        }

        Utilitario.enviarMensajeGlobalValido("Se ha ingresado correctamente");
    }

    public String irActualizar(Integer id) {
        Utilitario.putFlash("idalmacen", id);
        return "updatealmacen";
    }

    public void actualizaralmacen(ActionEvent evt) {

        if (producto.getId() == 0) {
            Utilitario.enviarMensajeGlobalError("Por favor seleccione un producto");
            return;
        }

        
        if (almacen.getCantidad() == 0) {
            Utilitario.enviarMensajeGlobalError("Debe ingresar la cantidad del producto");
            return;
        }

        try {
            
            producto.setFlag(true);
            almacen.setProducto(producto);
           
            almacendao.modificar(almacen);
            limpiar();
        } catch (Exception e) {
            Utilitario.enviarMensajeGlobalError("Error al insertar los datos");
            return;
        }

        Utilitario.enviarMensajeGlobalValido("Se ha actualizado correctamente");
    }

    public void eliminardelalmacen(ActionEvent evt) {
        AlmacenDao aldao = new AlmacenDaoImp();
        aldao.eliminar(almacen);
        almacenes = new Paginacion<Almacen>(almacendao.getAlmacen());
    }

    public void captura(int id) {
        almacen = almacendao.getAlmacenId(id);
    }

    public void limpiar() {
        almacen = new Almacen();
        producto = new Producto();
    }

    
    public void cambiarProducto(){
        productos=productodao.getProductosCond(producto.isFlag());
        
    }
//    private boolean esValido() {
//        if (almacen.getCantidad() == 0) {
//            Utilitario.enviarMensajeGlobalError("Debe ingresar la cantidad del producto");
//            return false;
//        }
//        if (cuentaProductos(producto.getId()) >= 1) {
//            Utilitario.enviarMensajeGlobalError("Este producto ya se ingresó, favor de seleccionar otro");
//            return false;
//        }
//       
//        return true;
//    }
    
    
    public String getEstado(boolean estado){
        String nomestado=null;
        if(estado==true){
            nomestado="Artículo";
        }
        else{
            nomestado="Comida";
        }
        
        return nomestado;
    }
    public int cuentaProductos(Integer id) {
        int result = 0;
        Session session = null;
        try {
            session = HibernateUtil.getSessionFactory().openSession();
            Query query = session.createQuery("FROM Almacen AS p WHERE p.producto.id=:s");
            query.setParameter("s", id);
            result = query.list().size();
            session.close();
        } catch (HibernateException e) {
        }
        return result;
    }

    public Almacen getAlmacen() {
        return almacen;
    }

    public void setAlmacen(Almacen almacen) {
        this.almacen = almacen;
    }

    public List<Producto> getProductos() {
        return productos;
    }

    public void setProductos(List<Producto> productos) {
        this.productos = productos;
    }

    public Producto getProducto() {
        return producto;
    }

    public void setProducto(Producto producto) {
        this.producto = producto;
    }

    public LazyDataModel<Almacen> getAlmacenes() {
        return almacenes;
    }

    public void setAlmacenes(LazyDataModel<Almacen> almacenes) {
        this.almacenes = almacenes;
    }
    
    
}
